﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DECOR.BL.BE;
using DECOR.BL.BC;
using System.Data;
using CM.BL.BE;

namespace DECOR.WebApp
{
    public partial class MatSubcontrata : System.Web.UI.Page
    {
        PedidoBE _lvObjPedido;

        protected void Page_Load(object sender, EventArgs e)
        {
            List<EnlaceMaterialBE> lstEMat = null;
            if (!Page.IsPostBack)
            {
                try
                {

                    RfcConfigParametersBE objUsuarioWeb = (RfcConfigParametersBE)Session["UsuarioWeb"];
                    this.cargaDatos();

                    lstEMat = (List<EnlaceMaterialBE>)Session["ObjEnla"];
                    gvMatAdic.DataSource = lstEMat;
                    gvMatAdic.DataBind();
                }
                catch (Exception ex)
                {
                    Session["Mensaje"] = ex.Message;
                }
            }
            else
            {
                try
                {
                   
                }
                catch (Exception ex)
                {
                    Session["Mensaje"] = ex.Message;
                }
            }

        }


        private void cargaDatos()
        {

            List<GenericBE> lst_OrgVentas = null;
            List<GenericBE> lst_CanalDist = null;

            if (Session["Pedido"] != null)
            {

                this._lvObjPedido = (PedidoBE)Session["Pedido"];
                if ((!string.IsNullOrEmpty(this._lvObjPedido.CodCliente)) && (Int64.Parse(this._lvObjPedido.CodCliente) > 0))
                {
                    lst_OrgVentas = ClienteBC.Instance.listaOrgVtas(this._lvObjPedido.CodCliente);
                    lst_CanalDist = ClienteBC.Instance.listaCanalDist(!string.IsNullOrEmpty(this._lvObjPedido.CodCliente) ? this._lvObjPedido.CodCliente : "", !string.IsNullOrEmpty(this._lvObjPedido.OrgVentas) ? this._lvObjPedido.OrgVentas : "1000");
                }
                else
                {
                    lst_OrgVentas = ClienteBC.Instance.listaOrgVtas("");
                }
                //cmbOrgVentas.Text = !string.IsNullOrEmpty(this._lvObjPedido.OrgVentas) ? this._lvObjPedido.OrgVentas : cmbOrgVentas.Text;
                //cmbCanalDist.Text = !string.IsNullOrEmpty(this._lvObjPedido.CanalDist) ? this._lvObjPedido.CanalDist : cmbCanalDist.Text;

                if (this._lvObjPedido.Detalle != null && this._lvObjPedido.Detalle.Count > 0)
                {
                    dlMaterialesSelec.ShowFooter = false;
                    dlMaterialesSelec.DataSource = this._lvObjPedido.Detalle;
                }
                else
                {
                    dlMaterialesSelec.ShowFooter = true;
                    dlMaterialesSelec.DataSource = new DataTable();
                }
                dlMaterialesSelec.DataBind();
            }
   


        }
        protected void dlMateriales_ItemCommand(object source, DataListCommandEventArgs e)
        {
            if (e.CommandName == "VerStock")
            {
            }
        }

        protected void dlMaterialesSelec_ItemCommand(object source, DataListCommandEventArgs e)
        {
            try
            {
                if (e.CommandName == "DelItem")
                {
                    //HiddenField hid2 = (HiddenField)e.Item.FindControl("hidMaterialId");
                    //string mID = hid2.Value;

                    //List<DetalleBE> lstMateriales;
                    //this._lvObjPedido = (PedidoBE)Session["Pedido"];
                    //lstMateriales = (this._lvObjPedido.Detalle == null) ? new List<DetalleBE>() : this._lvObjPedido.Detalle;

                    //// agregar logica para borrar el combo y no borrar los items
                    //string tmpTipoPos = lstMateriales[e.Item.ItemIndex].TipoPosicion;
                    //if (!ParametroBC.Instance.esTipoPosCombo(tmpTipoPos))
                    //{
                    //    lstMateriales.RemoveAll(X => X.PosSup == lstMateriales[e.Item.ItemIndex].Posicion);
                    //    lstMateriales.RemoveAt(e.Item.ItemIndex);
                    //}
                    //else
                    //{
                    //    Session["Mensaje"] = "No se pueden borrar los componentes del Combo";
                    //}
                    //this._lvObjPedido.Detalle = lstMateriales;
                    //Session["Pedido"] = this._lvObjPedido;

                    //dlMaterialesSelec.ShowFooter = false;
                    //if (lstMateriales.Count == 0) { dlMaterialesSelec.ShowFooter = true; }
                    //dlMaterialesSelec.DataSource = lstMateriales;
                    //dlMaterialesSelec.DataBind();
                }
            }
            catch (Exception ex)
            {
                Session["Mensaje"] = ex.Message;
            }
            finally
            {
                ((Site2)Master).muestraMensajes();
                upMaterialesSelec.Update();
            }
        }
        
        protected void gvMatAdic_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                int idx = Convert.ToInt32(e.CommandArgument);
                GridViewRow gvr = gvMatAdic.Rows[idx];
                string version = gvr.Cells[1].Text;
                string werks =  gvr.Cells[2].Text;//centro
                List<EnlaceMaterialBE> lstEnlace = (List<EnlaceMaterialBE>)Session["ObjEnla"];

                if (e.CommandName == "Selec" )// || e.CommandName == "VerStockEC")
                { 
                    //obtengo los materiales de la version y centro seleccionados
                    foreach (EnlaceMaterialBE itm in lstEnlace)
                    {
                        if (itm.Werks == werks && itm.Stlal == version)
                        {
                            foreach (EstructuraPosicinListaMateriales det in itm.PosicionListaMateriales)
                            {
                                if (det.WERKS == itm.Werks && det.STLAL == itm.Stlal)
                                {
                                    string retVal = addItemAdic(det.Matnr, 1);
                                }
                            }
                            break;
                        }
                    }

                    this._lvObjPedido = (PedidoBE)Session["Pedido"];
                    List<DetalleBE> lstMateriales = this._lvObjPedido.Detalle;
                    dlMaterialesSelec.DataSource = lstMateriales;
                    dlMaterialesSelec.DataBind();


                }
            }
            catch (Exception ex)
            {
                Session["Mensaje"] = ex.Message;
                ((Site2)Master).muestraMensajes();
            }
            finally
            {

            }
        
        }
        protected void gvMatAdic_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            //this._lvObjPedido = (PedidoBE)Session["Pedido"];
            //if (e.CommandName == "VerStock")// || e.CommandName == "VerStockEC")
            //{
            //}
        }

        private string addItemAdic(string pCodMat, decimal pCant)
        {
            string retMsg = "";

            try
            {
                this._lvObjPedido = (PedidoBE)Session["Pedido"];
                List<DetalleBE> lstMateriales = (this._lvObjPedido.Detalle == null) ? new List<DetalleBE>() : this._lvObjPedido.Detalle;

                DetalleBE objDetalle = new DetalleBE();
                objDetalle.CodMaterial = pCodMat;
                objDetalle.Cantidad = pCant;

                MaterialBE objMaterial = MaterialBC.Instance.leerMaterial(objDetalle.CodMaterial, this._lvObjPedido.OrgVentas, this._lvObjPedido.CanalDist);

                if (objMaterial != null)
                {
                    //@rgutierrez 09.11.2011
                    //objDetalle.DctoGenericoZD08.Importe = _lvObjPedido.Detalle[0].DctoGenericoZD08.Importe;
                    //objDetalle.DctoGenericoZD08.Valor = Math.Round(_lvObjPedido.Detalle[0].DctoGenericoZD08.Importe * pCant * objMaterial.PrecioUnit / 1000,2);

                    objDetalle.DescMaterial = objMaterial.DescMaterial;
                    objDetalle.CodUMedida = objMaterial.CodUMedida;
                    objDetalle.Peso = objMaterial.Peso;
                    objDetalle.UMedidaRendimiendo = objMaterial.UMedidaRendimiendo;
                    objDetalle.ValorRendimiento = objMaterial.ValorRendimiento;
                    objDetalle.TipoMaterial = objMaterial.TipoMaterial;

                    objDetalle.Material = objMaterial;

                    //si UM = UNidad => redondear al entero mayor
                    if (ParametroBC.Instance.esTipoX(objDetalle.CodUMedida, "UMUnidad"))
                    {
                        objDetalle.Cantidad = (objDetalle.Cantidad > decimal.Truncate(objDetalle.Cantidad)) ? decimal.Truncate(objDetalle.Cantidad) + 1 : objDetalle.Cantidad;
                    }
                    //--- calcular rendimiento
                    if (!ParametroBC.Instance.esTipoX(objDetalle.Material.Tipo, "TipoMatServicio") &&
                        ParametroBC.Instance.esTipoX(objDetalle.Material.UMedidaRendimiendo, "UMRendimiento"))
                    {
                        objDetalle.Cantidad = PedidoBC.Instance.calculaRendimiento(objDetalle.Cantidad, objDetalle.ValorRendimiento); //rgutierrez 15.11.2011
                        //objDetalle.Cantidad = this.calculaRendimiento(objDetalle.Cantidad, objDetalle.ValorRendimiento);
                    }

                    bool auxC = false;
                    //--- cargar data de prioridad de entrega en base a la cond de exp.
                    //if (!string.IsNullOrEmpty(this._lvObjPedido.CondExp) && !cmbTipoDocumento.SelectedValue.Equals("Z037"))
                    //{
                    //    objDetalle.PrioridadEntrega = this._lvObjPedido.CondExp;
                    //    auxC = true;

                    //}
                    /*20110714 Inicio WCA  */
                    string canalesCondDesNor = ParametroBC.Instance.getParamValue("CondPriorDespNormal");
                    if (!string.IsNullOrEmpty(canalesCondDesNor))
                    {
                        string[] aCanalCond = canalesCondDesNor.Split(',');
                        for (int iCan = 0; iCan < aCanalCond.Length; iCan++)
                        {
                            //if (aCanalCond[iCan].Equals(this.cmbCanalDist.SelectedValue))
                            //{
                            //    objDetalle.PrioridadEntrega = ParametroBC.Instance.getParamValue("PriorDetReparto");
                            //    break;
                            //}
                        }

                    }
                    /*20110714 Fin  */
                    //--- cargar fecha de entrega
                    if (this._lvObjPedido.FechaEntrega != objDetalle.Repartos[0].FechaEntrega)
                    {
                        objDetalle.Repartos[0].FechaEntrega = this._lvObjPedido.FechaEntrega;
                        auxC = true;
                    }
                    //if (auxC) { this.calculaFechaEntregaItem(objDetalle); }
                    objDetalle.Repartos[0].CantPed = objDetalle.Cantidad;
                    objDetalle.Repartos[0].CantConf = objDetalle.Cantidad;
                    //--- cálculo de posición
                    string tmpPos = "";
                    if (lstMateriales.Count > 0)
                    {
                        tmpPos = lstMateriales[lstMateriales.Count - 1].Posicion;
                    }
                    else
                    {
                        tmpPos = "00";
                    }
                    int posi = Convert.ToInt16(tmpPos) + 10;
                    Session["ultimaPosAdd"] = posi;
                    objDetalle.Posicion = posi.ToString();
                    objDetalle.TipoPosicion = "Z012";
                    lstMateriales.Add(objDetalle);

                    //--- validar si es un material Z004/Z001 combo/kit
                    if (ParametroBC.Instance.esTipoX(objMaterial.Tipo, "TipoMatCombo"))
                    {
                        //buscar materiales asociados y añadirlos
                        string pTipoPos = "";

                        List<DetalleBE> lstDetalle = PedidoBC.Instance.buscaTipoPosicion(this._lvObjPedido.CodTipoDoc, objMaterial.CodMaterial, this._lvObjPedido.OrgVentas,
                                          this._lvObjPedido.CanalDist, out pTipoPos);
                        objDetalle.TipoPosicion = pTipoPos.Equals("") ? objDetalle.TipoPosicion : pTipoPos;

                        //--- si tiene elementos, entonces es un KIT o Combo
                        //foreach (DetalleBE item in lstDetalle)
                        //{
                        //    item.DescMaterial = item.Material.DescMaterial;
                        //    item.CodUMedida = item.Material.CodUMedida;
                        //    item.Peso = item.Material.Peso;
                        //    item.UMedidaRendimiendo = item.Material.UMedidaRendimiendo;
                        //    item.ValorRendimiento = item.Material.ValorRendimiento;
                        //    item.TipoMaterial = item.Material.TipoMaterial;

                        //    posi += 10;
                        //    item.Posicion = posi.ToString();
                        //    item.PosSup = objDetalle.Posicion;

                        //    item.Cantidad = item.CantComp * objDetalle.Cantidad;
                        //    //si UM = UNidad => redondear al entero mayor
                        //    if (ParametroBC.Instance.esTipoX(item.CodUMedida, "UMUnidad"))
                        //    {
                        //        item.Cantidad = (item.Cantidad > decimal.Truncate(item.Cantidad)) ? decimal.Truncate(item.Cantidad) + 1 : item.Cantidad;
                        //    }
                        //    //--------------------
                        //    if (item.Material == null)
                        //    {
                        //        item.Material = MaterialBC.Instance.leerMaterial(item.CodMaterial, this._lvObjPedido.OrgVentas, this._lvObjPedido.CanalDist);
                        //    }
                        //    //--- calcular rendimiento
                        //    if (!ParametroBC.Instance.esTipoX(item.Material.Tipo, "TipoMatServicio") &&
                        //        ParametroBC.Instance.esTipoX(item.Material.UMedidaRendimiendo, "UMRendimiento"))
                        //    {
                        //        item.Cantidad = PedidoBC.Instance.calculaRendimiento(item.Cantidad, item.ValorRendimiento); //rgutierrez 15.11.2011
                        //        //item.Cantidad = this.calculaRendimiento(item.Cantidad, item.ValorRendimiento);
                        //    }
                        //    if (this._lvObjPedido.CodTipoDoc != "Z034")
                        //    {
                        //        switch (objDetalle.TipoPosicion)
                        //        {
                        //            case "Z011":
                        //                item.TipoPosicion = "Z012";
                        //                break;
                        //            case "Z016":
                        //                item.TipoPosicion = "Z017";
                        //                break;
                        //            case "Z007":
                        //                item.TipoPosicion = "Z008";
                        //                break;
                        //            case "Z014":
                        //                item.TipoPosicion = "Z015";
                        //                break;
                        //        }
                        //    }
                        //    auxC = false;
                        //    //--- cargar data de prioridad de entrega en base a la cond de exp.
                        //    if (!string.IsNullOrEmpty(this._lvObjPedido.CondExp))
                        //    {
                        //        item.PrioridadEntrega = this._lvObjPedido.CondExp;
                        //        auxC = true;
                        //    }
                        //    /*20110714 Inicio WCA  */
                        //    if (!string.IsNullOrEmpty(canalesCondDesNor))
                        //    {
                        //        string[] aCanalCond = canalesCondDesNor.Split(',');
                        //        for (int iCan = 0; iCan < aCanalCond.Length; iCan++)
                        //        {
                        //            if (aCanalCond[iCan].Equals(this.cmbCanalDist.SelectedValue))
                        //            {
                        //                item.PrioridadEntrega = ParametroBC.Instance.getParamValue("PriorDetReparto");
                        //                break;
                        //            }
                        //        }

                        //    }
                        //    /*20110714 Fin  */

                        //    //--- cargar fecha de entrega
                        //    if (this._lvObjPedido.FechaEntrega != objDetalle.Repartos[0].FechaEntrega)
                        //    {
                        //        objDetalle.Repartos[0].FechaEntrega = this._lvObjPedido.FechaEntrega;
                        //        auxC = true;
                        //    }
                        //    if (auxC) { this.calculaFechaEntregaItem(item); }
                        //    objDetalle.Repartos[0].CantPed = item.Cantidad;
                        //    objDetalle.Repartos[0].CantConf = item.Cantidad;
                        //    //--- solo agregar los q no hayan sido agregados antes
                        //    lstMateriales.Add(item);
                        //}
                    }
                    this._lvObjPedido.Detalle = lstMateriales;
                    Session["Pedido"] = this._lvObjPedido;
                }
                else
                {
                    retMsg = "No se encontró el material.";
                }
            }
            catch (Exception ex)
            {
                retMsg = ex.Message;
            }
            return retMsg;
        }

        protected void dlMaterialesSelec_ItemDataBound(object sender, DataListItemEventArgs e)
        {

            if (e.Item.ItemType == ListItemType.Header)
            {
                LinkButton lnk = new LinkButton();
                lnk = (LinkButton)e.Item.FindControl("lnkCrearPedido");
                lnk.ID = "lnkCrearPedido";
                lnk.PostBackUrl = "~/" + (string)Session["pagAnt"];
            }
        }
    }
}
